package org.hncors.gnssparse;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 金额计算工具类
 * 
 * @Author Ming.Zi
 * @Date Mar 10, 2015
 * @Version 1.0
 */
public class MoneyUtil {
	public static final double DOUBLE_VALUE = 0.00;

	private static final DecimalFormat nf = new DecimalFormat("#0.00");

	private static final int DEFAULT_SCALE = 0;

	/**
	 * 相加 v1 + v2
	 * 
	 * @param v1
	 * @param v2
	 * @return 相加之和
	 */
	public static long add(long v1, long v2) {
		BigDecimal b1 = new BigDecimal(String.valueOf(v1));
		BigDecimal b2 = new BigDecimal(String.valueOf(v2));
		return b1.add(b2).longValue();
	}

	/**
	 * 相加 v1 + v2
	 * 
	 * @param v1
	 *            BigDecimal
	 * @param v2
	 *            BigDecimal
	 * @return 相加之和 BigDecimal
	 */
	public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
		return v1.add(v2);
	}

	/**
	 * 相减 v1 - v2
	 * 
	 * @param v1
	 * @param v2
	 * @return 差值
	 */
	public static long subtract(long v1, long v2) {
		BigDecimal b1 = new BigDecimal(String.valueOf(v1));
		BigDecimal b2 = new BigDecimal(String.valueOf(v2));
		return b1.subtract(b2).longValue();
	}

	/**
	 * 相减 v1 - v2
	 * 
	 * @param v1
	 * @param v2
	 * @return 差值
	 */
	public static BigDecimal subtract(BigDecimal v1, BigDecimal v2) {
		return v1.subtract(v2);
	}

	/**
	 * 相乘 v1 * v2
	 * 
	 * @param v1
	 * @param v2
	 * @return 结果
	 */
	public static long multiply(long v1, long v2) {
		BigDecimal b1 = new BigDecimal(String.valueOf(v1));
		BigDecimal b2 = new BigDecimal(String.valueOf(v2));
		return b1.multiply(b2).longValue();
	}

	/**
	 * 相乘 v1 * v2
	 * 
	 * @param v1
	 * @param v2
	 * @return 结果
	 */
	public static BigDecimal multiply(BigDecimal v1, BigDecimal v2) {
		return v1.multiply(v2);
	}

	/**
	 * 相除 v1/v2 采取四舍五入，使用默认的精度0
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static long divide(long v1, long v2) {
		return divide(v1, v2, DEFAULT_SCALE);
	}

	/**
	 * 相除 v1/v2 采取四舍五入
	 * 
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static long divide(long v1, long v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(String.valueOf(v1));
		BigDecimal b2 = new BigDecimal(String.valueOf(v2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).longValue();
	}

	/**
	 * 相除 v1/v2 采取四舍五入，使用默认的精度0
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
		return divide(v1, v2, DEFAULT_SCALE);
	}

	/**
	 * 相除 v1/v2 采取四舍五入
	 * 
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static BigDecimal divide(BigDecimal v1, BigDecimal v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		return v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 
	 * @param donomer
	 *            分母
	 * @param mutip
	 *            乘数
	 * @param molec
	 *            分子
	 * @return
	 */
	public static Double getCalculatedAmount(Double donomer, Double mutip, Double molec) {
		BigDecimal donomerTemp = new BigDecimal(donomer); // 分母
		BigDecimal molecTemp = new BigDecimal(molec); // 分子
		BigDecimal mutipTemp = new BigDecimal(mutip);// 乘数
		return mutipTemp.multiply(molecTemp).divide(donomerTemp, 6, BigDecimal.ROUND_HALF_UP).doubleValue();

	}

	/**
	 * 
	 * @param donomer
	 *            分母
	 * @param mutip
	 *            乘数
	 * @param molec
	 *            分子
	 * @return
	 */
	public static BigDecimal getCalculatedAmountBigDecimal(BigDecimal donomer, BigDecimal mutip, BigDecimal molec) {
		BigDecimal donomerTemp = donomer; // 分母
		BigDecimal molecTemp = molec; // 分子
		BigDecimal mutipTemp = mutip;// 乘数
		return mutipTemp.multiply(molecTemp).divide(donomerTemp, 0, getDefaultMoneyDecimal());
	}

	/**
	 * 
	 * @param donomer
	 *            分母
	 * @param mutip
	 *            乘数
	 * @param molec
	 *            分子
	 * @return
	 */
	public static BigDecimal getAmountWithScale(BigDecimal donomer, BigDecimal mutip, BigDecimal molec, int scale) {
		donomer = donomer.setScale(scale);
		mutip = mutip.setScale(scale);
		molec = molec.setScale(scale);
		BigDecimal donomerTemp = donomer; // 分母
		BigDecimal molecTemp = molec; // 分子
		BigDecimal mutipTemp = mutip;// 乘数
		return mutipTemp.multiply(molecTemp).divide(donomerTemp, scale, getDefaultMoneyDecimal());
	}

	public static int getDefaultMoneyDecimal() {
		return BigDecimal.ROUND_HALF_UP;
	}

	/**
	 * 相加
	 * 
	 * @param addAmount
	 * @param addedAmount
	 * @return
	 */
	public static Double addAmount(Double addAmount, Double addedAmount) {
		BigDecimal add = new BigDecimal(addAmount);
		BigDecimal augend = new BigDecimal(addedAmount);
		return add.add(augend).doubleValue();
	}

	/**
	 * 相加
	 * 
	 * @param addAmount
	 * @param addedAmount
	 * @return
	 */
	public static BigDecimal addAmountBigDecimal(BigDecimal addAmount, BigDecimal addedAmount) {
		BigDecimal add = addAmount;
		BigDecimal augend = addedAmount;
		return add.add(augend);
	}

	/**
	 * 相减
	 * 
	 * @param subtrahendAmount
	 * @param subtrahendedAmount
	 * @return
	 */
	public static Double getSubtrahendAmount(Double subtrahendAmount, Double subtrahendedAmount) {
		BigDecimal subtrahend = new BigDecimal(subtrahendAmount);
		BigDecimal subtrahended = new BigDecimal(subtrahendedAmount);
		return subtrahend.subtract(subtrahended).doubleValue();
	}

	public static BigDecimal getSubtrahendAmountBigDecimal(BigDecimal subtrahendAmount, BigDecimal subtrahendedAmount) {
		BigDecimal subtrahend = subtrahendAmount;
		BigDecimal subtrahended = subtrahendedAmount;
		return subtrahend.subtract(subtrahended);
	}

	public static BigDecimal formatCent2Yuan(BigDecimal cent, int scale) {
		if (cent == null)
			return BigDecimal.ZERO.setScale(scale);
		BigDecimal result = cent.divide(new BigDecimal(100)).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return result;
	}

	public static double formatToMoney(String s) {
		double d = DOUBLE_VALUE;
		if (s == null || s.trim().length() == 0) {
		} else {
			try {
				d = Double.parseDouble(s);
				d = formatToMoney(d);
			} catch (NumberFormatException e) {
				d = DOUBLE_VALUE;
			}
		}
		return d;
	}

	public static double formatToMoney(double d) {
		try {
			return Double.parseDouble(nf.format(d));
		} catch (NumberFormatException e) {
			return d;
		}
	}

	public static String unitToYuan(long value){ //分转元
		return String.format("%.2f", value/100f);
	}
	public static void main(String[] args) {
		// System.out.println("value:" +
		// MoneyUtil.formatMoney2StrByMillesimal(125444444));
		/*double a = MoneyUtil.getAmountWithScale(new BigDecimal(5), new BigDecimal(8), new BigDecimal(1), 2)
				.doubleValue();
		System.out.println(a);*/
		String priceStr = "89.12";
		BigDecimal bigDecimal = new BigDecimal(priceStr);
		BigDecimal price = MoneyUtil.multiply(bigDecimal, new BigDecimal(100L));
		System.out.println(price.longValue());

	}

}
